iT邦幫忙

2024 iThome 鐵人賽

DAY 25
1
Python

使用 WiFiBoy Python 玩學機來學物聯網應用 系列 第 25

25. 藍芽 BLE 收發訊息

  • 分享至 

  • xImage
  •  

藍芽技術簡介

藍牙技術就像是你手機或其他設備之間的「無線對話」,它能讓設備之間在不需要任何電線的情況下,互相傳送資料。這種「對話」使用的是無線電波,但與我們聽到的收音機不同,藍牙使用的無線電波範圍非常短,通常只在10米內有效。

  • 主要原理:

    • 配對:當你想讓兩個設備(例如手機和藍牙耳機)連接時,首先需要「配對」。這有點像是你要先交換聯絡方式,兩個設備才能認識彼此,這樣它們才能進行安全的通訊。

    • 低功耗:藍牙的設計重點之一就是低功耗,這意味著它非常省電,特別適合小型設備,如耳機、手錶或運動追蹤器。

    • 頻率跳頻:為了避免其他無線設備(如 Wi-Fi)干擾藍牙,它會不斷改變自己使用的頻率,就像是在一堆擁擠的頻道裡,快速地切換到比較清晰的頻道,確保訊號不會被干擾。

    • 小範圍網絡:藍牙可以讓多個設備形成一個小型的無線網絡,稱為「Piconet」。在這個網絡裡,最多可以有 7 個設備互相連接,就像是朋友之間的小群組,每個人都能互相交流。

    • 傳輸數據:當設備連接後,它們可以傳送各種數據,例如音樂、檔案或訊息。這些數據會被打包成「小封包」,通過無線電波送到另一個設備,然後再被解開來使用。

  • 常見應用:

    • 無線耳機
    • 無線鍵盤滑鼠
    • 智能家庭設備: 燈炮、門鎖、溫溼度計等。

搜尋附近的藍芽裝置

import time
import bluetooth
from micropython import const
_IRQ_SCAN_RESULT = const(5)
_IRQ_SCAN_DONE = const(6)

def bt_irq(event, data):
  if event == _IRQ_SCAN_RESULT:
    # A single scan result.
    addr_type, addr, connectable, rssi, adv_data = data
    print(':'.join(['%02X' % i for i in addr]))
  elif event == _IRQ_SCAN_DONE:
    # Scan duration finished or manually stopped.
    print('scan complete')

# Scan for 10s (at 100% duty cycle)
ms_scan = 10000
bt = bluetooth.BLE()
bt.irq(bt_irq)
bt.active(True)
bt.gap_scan(ms_scan, 30000, 30000)
time.sleep_ms(ms_scan)
import ubluetooth
import time

class ESP32_Bluetooth:
    def __init__(self):
        self.bt = ubluetooth.BLE()
        self.bt.active(True)
        self.bt.irq(self.bt_irq)
        self.scan_results = None
        self.conn = None

    def bt_irq(self, event, data):
        if event == 1:  # BLE.IRQ_SCAN_RESULT
            addr_type, addr, adv_type, rssi, adv_data = data
            if b'WiFiBoy_B' in adv_data:  # 找到機器B
                self.scan_results = addr
                self.bt.gap_scan(None)  # 停止掃描
        elif event == 7:  # BLE.IRQ_PERIPHERAL_CONNECT
            self.conn = data
        elif event == 8:  # BLE.IRQ_PERIPHERAL_DISCONNECT
            self.conn = None

    def scan(self):
        self.bt.gap_scan(2000, 30000, 30000)  # 開始掃描2秒

    def connect(self):
        if self.scan_results:
            self.bt.gap_connect(0, self.scan_results)

    def send_message(self, message):
        if self.conn:
            self.bt.gattc_write(self.conn, 0x0010, message.encode('utf-8'), 1)

    def receive_message(self):
        if self.conn:
            return self.bt.gattc_read(self.conn, 0x0010)

    def close(self):
        if self.conn:
            self.bt.gap_disconnect(self.conn)

# 程序執行
bt_a = ESP32_Bluetooth()

bt_a.scan()
time.sleep(2)
bt_a.connect()
time.sleep(1)
bt_a.send_message("你好!我是玩學機A,請問你是誰?")

while True:
    received = bt_a.receive_message()
    if received:
        print("收到:", received)
        response = input("輸入訊息發送給B:")
        bt_a.send_message(response)


上一篇
24. RFID 讀取與寫入
下一篇
26. 建立網頁伺服器
系列文
使用 WiFiBoy Python 玩學機來學物聯網應用 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言